#include <iostream>
#include <algorithm>
#include <vector>
#include <string>

using namespace std;

void elimDups(vector<string> &);
bool isShorter(const string &, const string &);
void printWords(vector<string> &);

int main()
{
    vector<string> words{"the", "quick", "red", "fox", "jumps", 
                        "over", "the", "slow", "red", "turtle"};
    // 按长度由短至长排序 words
    sort(words.begin(), words.end(), isShorter);
    printWords(words);

    elimDups(words); // 将 words 按字典序重排，并消除重复单词
    // 按长度重新排序，长度相同的单词维持字典序
    stable_sort(words.begin(), words.end(), isShorter);
    printWords(words);
}

void elimDups(vector<string> &words)
{
    // 按字典序排序 words，以便查找重复单词
    sort(words.begin(), words.end());
    // unique 重排输入范围，使得每个单词只出现一次
    // 排列在范围的前部，返回指向不重复区域之后一个位置的迭代器
    auto end_unique = unique(words.begin(), words.end());
    // 使用向量操作 erase 删除重复单词
    words.erase(end_unique, words.end());
}

// 比较函数，用来按长度排序单词
bool isShorter(const string &s1, const string &s2)
{
    return s1.size() < s2.size();
}

void printWords(vector<string> &words)
{
    for (const auto &s : words) // 无须拷贝字符串
        cout << s << " "; // 打印每个元素，以空格分隔
    cout << endl;
}